package main

import (
	"fmt"
	"time"
)

/*
并发：

		概念：
			并发，在操作系统中，是指一个时间段中有几个程序都处于已启动运行带运行完毕之间，
	        且这几个程序都是在同一个处理机上运行，任何一个时刻点上只有一个程序在处理机上运行
		并发与并行的区别：
		并发：
			当有多个线程早操作的时候，如果系统只有一个CPU，则他可能真正同时进行一个以上的线程，
			他只能把CPU运行时间划分为若干个时间段，再将时间段分配给各个线程，在一个时间的线程代码运行时
			其他线程处于挂起状态，这种方式我们称之为并发
		并行：
			当系统有一个以上CPU时，则线程的操作有可能并发，当CPU执行一个线程的时候，另一个CPU可以执行另一个线程
			两个线程互不抢占CPU资源，可以同时进行，这种方式我们称之为并行
		并行在多处理器系统中存在，而并发可以在单处理器和多处理器系统中都存在，

		区别：
			并发和并行是既相似又有区别的两个概念，并行是指两个或者多个事件在 同一时刻 发生；而并发是指两个或多个事件在
			同一时间段 内发生。在多道程序环境下，并发性是指在一段时间内宏观上有多个程序在同时运行，但在单处理机系统中，
			每一时刻却仅能有一道程序执行，故微观上这些程序只能是分时地交替执行。倘若在计算机系统中有多个处理机，
			则这些可以并发执行的程序便可被分配到多个处理机上，实现并行执行，即利用每个处理机来处理一个可并发执行的程序，
			这样，多个程序便可以同时执行。
		总结：
			解释一：并行是指两个或者多个事件在同一时刻发生；而并发是指两个或多个事件在同一时间间隔发生。
			解释二：并行是在不同实体上的多个事件，并发是在同一实体上的多个事件。
			解释三：并行是在多台处理器上同时处理多个任务。如 hadoop 分布式集群，并发是在一台处理器上“同时”处理多个任务。
		所以并发编程的目标是充分的利用处理器的每一个核，以达到最高的处理性能。
*/

/*
Go 并发

	Go语言支持并发，我们只需要通过go 关键子来开启 goroutine 即可。
	goroutine 轻量级线程，goroutine 的调度是有Golang 运行时进行管理的。
	goroutine 语法格式： go 函数(参数列表)
	例如：
		go f(x,y,z)
		开启一个新的goroutine: f(x,y,z)
	Go 允许使用go 语句开启一个新的运行期线程，即 goroutine,以一个不同的、新创建的 goroutine 来执行一个函数，
	同一个程序中的所有，goroutine 共享同一个内存空间
*/
func say(s string) {
	for i := 0; i < 5; i++ { //执行五次
		//Milliseconds()函数用于以整数毫秒计数的形式查找持续时间
		time.Sleep(100 * time.Millisecond)
		fmt.Println(s)
	}
}

func main() {
	go say("world")
	say("hello")
}

//执行以上代码，你会看到输出的 hello 和 world 是没有固定先后顺序。因为它们是两个 goroutine 在执行。
